001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Nov 27, 2002
005 * Time: 3:50:38 PM
006 */
007
008 package EVolve.visualization.XYViz;
009
010 import EVolve.visualization.*;
011 import EVolve.util.painters.*;
012 import EVolve.util.*;
013 import EVolve.util.phasedetectors.PhaseDetector;
014 import EVolve.util.sourcebrowser.SourceBrowser;
015 import EVolve.Scene;
016 import javax.swing.*;
017 import java.util.*;
018 import java.awt.event.*;
019 import java.awt.*;
020
021 public abstract class XYVisualization extends Visualization{
022 protected int autoInterval,interval;
023 protected long xMax, xOffset, currentThread;
024 protected String autoPredictorname;
025 protected boolean shift_pressed, flipMagnifier = true;
026 protected Painter painter;
027 protected Magnifier magnifier;
028 protected JMenuItem itemChangeOrientation,itemScale,itemBrowseSource;
029 protected boolean normalOrientation;
030 protected HashMap imageMap,threadDataSet;
031 protected SourceBrowser sourceBrowser;
032 protected AxesPanel canvas;
033 protected AutoImage image; // the image
034 protected ArrayList timeMap;
035 protected PhaseDetector phaseDetector;
036 protected boolean phaseDetectorEnabled;
037
038 protected abstract void mouseMove(int x, int y);
039
040 public XYVisualization() {
041 super();
042 shift_pressed = false;
043 autoInterval = -1;
044 autoPredictorname = null;
045 interval = -1;
046 normalOrientation = true;
047 currentThread = -1;
048 imageMap = new HashMap();
049 threadDataSet = new HashMap();
050 sourceBrowser = new SourceBrowser();
051 timeMap = new ArrayList();
052 phaseDetectorEnabled = Scene.getVisualizationManager().isPhaseDetectorEnabled();
053 }
054
055 protected Component createPanel() {
056 canvas = new AxesPanel(AxesPanel.Axis_Enabled | AxesPanel.Flip_Image | AxesPanel.Scale_Image);
057 flipMagnifier = true;
058 addMagnifier(canvas,flipMagnifier);
059 JScrollPane returnVal = new JScrollPane(canvas);
060 canvas.setParent(returnVal);
061
062 return returnVal;
063 }
064
065 protected void addMagnifier(Component aPanel, boolean flipImage) {
066 magnifier = new Magnifier(flipImage);
067 aPanel.addMouseMotionListener(new MouseMotionAdapter() {
068 public void mouseMoved(MouseEvent e) {
069
070 if (e.isShiftDown()) shift_pressed = true;
071 else shift_pressed = false;
072
073 if (e.isControlDown()) {
074 int x = e.getX(), y = e.getY();
075 x = canvas.getImageX(x);
076 y = canvas.getImageY(y);
077 magnifier.convertMousePosition(canvas);
078 magnifier.showWindow(canvas.getSubImage(x,y));
079 canvas.drawZoomingArea(e.getX(),e.getY());
080 }
081 mouseMove(e.getX(), e.getY());
082 }
083
084 public void mouseDragged(MouseEvent e) {
085 if (e.isShiftDown()) shift_pressed = true;
086 else shift_pressed = false;
087 mouseMove(e.getX(), e.getY());
088 }
089 });
090
091
092 aPanel.addMouseListener(new MouseListener() {
093 public void mouseClicked(MouseEvent e) {
094 mouseX = e.getX();
095 mouseY = e.getY();
096 freezed = false;
097 }
098
099 public void mouseEntered(MouseEvent e) {}
100
101 public void mouseExited(MouseEvent e) {}
102
103 public void mousePressed(MouseEvent e) {}
104
105 public void mouseReleased(MouseEvent e) {}
106 });
107
108 }
109
110 protected void updateConfiguration() {
111 if (panel instanceof JScrollPane)
112 ((AxesPanel)(((JScrollPane)panel)).getViewport().getView()).setImage(null);
113 else
114 ((AxesPanel)panel).setImage(null);
115 panel.repaint();
116
117 normalOrientation = true;
118 }
119
120 protected void createMenu() {
121 super.createMenu();
122
123 itemScale = new JMenuItem("Restore");
124 itemScale.setMnemonic(KeyEvent.VK_R);
125 itemScale.addActionListener(new ActionListener() {
126 public void actionPerformed(ActionEvent e) {
127 if (e.getActionCommand().charAt(0) == 'F') {
128 canvas.scaleImage(true);
129 itemScale.setText("Restore");
130 itemScale.setActionCommand("Restore");
131 itemScale.setMnemonic(KeyEvent.VK_R);
132 } else {
133 canvas.scaleImage(false);
134 itemScale.setText("Fit Window");
135 itemScale.setActionCommand("Fit Window");
136 itemScale.setMnemonic(KeyEvent.VK_F);
137 }
138 canvas.repaint();
139 }
140 });
141 itemScale.setSelected(true);
142
143 itemBrowseSource = new JMenuItem("Browse source code...");
144 itemBrowseSource.setMnemonic(KeyEvent.VK_B);
145 itemBrowseSource.addActionListener(new ActionListener() {
146 public void actionPerformed(ActionEvent e) {
147 sourceBrowser.showSourceFile(getEntityUnderMouse());
148 }
149 });
150 popup.add(itemBrowseSource);
151 popup.add(itemScale);
152 itemBrowseSource.setEnabled(false);
153 }
154
155 public VisualizationDefinition getDefinition() {
156 return definition;
157 }
158
159 public void autoUpdateConfiguration(HashMap config) {
160 autoInterval = ((Integer)config.get("Interval")).intValue();
161 PredictorFactory predictor = (PredictorFactory)config.get("Predictor");
162 autoPredictorname = (predictor == null) ? null : predictor.getName();
163 interval = autoInterval;
164 super.autoUpdateConfiguration(config);
165 }
166
167 public HashMap getCurrentConfigure() {
168 HashMap configure = super.getCurrentConfigure();
169
170 configure.put("Interval", new Integer(interval));
171
172 return configure;
173 }
174
175 public long getxMax() {
176 return xMax;
177 }
178
179 public AutoImage getImage() {
180 return image;
181 }
182
183 public void setImage(AutoImage image) {
184 this.image = image;
185 }
186
187 public void updateMenu() {
188 super.updateMenu();
189 if (itemChangeOrientation == null) {
190 itemChangeOrientation = new JMenuItem("Change Orientation");
191 itemChangeOrientation.setMnemonic(KeyEvent.VK_C);
192 itemChangeOrientation.addActionListener(new ActionListener() {
193 public void actionPerformed(ActionEvent e) {
194 changeOrientation();
195 }
196 });
197 popup.add(itemChangeOrientation);
198 }
199 }
200
201 public void disablePopupMenu() {
202 MenuElement[] menus = popup.getSubElements();
203 for (int i=0; i<menus.length; i++) {
204 if (((JMenuItem)menus[i]).getText().equals("Sort") ||
205 ((JMenuItem)menus[i]).getText().equals("Save...") ||
206 ((JMenuItem)menus[i]).getText().equals("Restore") ||
207 ((JMenuItem)menus[i]).getText().equals("Fit Window"))
208 continue;
209 ((JMenuItem)menus[i]).setEnabled(false);
210 }
211 Scene.getUIManager().disableFunctionMenus();
212 }
213
214 protected void changeOrientation() {
215 AutoImage newImage = new AutoImage();
216 int wMax = image.getW();
217 int hMax = image.getH();
218 Color color;
219
220 for (int i=0; i<wMax; i++) {
221 for (int j=0; j<hMax; j++) {
222 color = (Color)image.getColor(i,j);
223 if (color != null) {
224 newImage.setColor(j,i,color);
225 }
226 }
227 }
228 image = newImage;
229
230 normalOrientation = ! normalOrientation;
231 }
232
233 protected void switchThread(long threadId) {
234 if (currentThread != threadId) {
235 currentThread = threadId;
236 image = (AutoImage)imageMap.get(new Long(threadId));
237 if (image == null) {
238 image = new AutoImage();
239 imageMap.put(new Long(threadId),image);
240 }
241 }
242 }
243
244 protected void installPainter() {
245 painter = new DefaultPainter();
246 }
247
248 protected void enableBrowseSourceMenu() {
249 itemBrowseSource.setEnabled(true);
250 }
251
252 protected void countEvents(long x) {
253 /*while (x/Math.abs(interval) >= eventCounter.size()) {
254 eventCounter.add(new Long(Scene.getEventCounter()));
255 }
256
257 while (x/Math.abs(interval) >= timeCounter.size()) {
258 timeCounter.add(new Long(x));
259 }*/
260 long eventNo = Scene.getEventCounter();
261 long[] time2event = new long[2];
262 time2event[0] = x;
263 time2event[1] = eventNo;
264 while (x/Math.abs(interval) - xOffset >= timeMap.size()) {
265 timeMap.add(time2event);
266 }
267 }
268
269 public void cleanup() {
270 super.cleanup();
271 magnifier.cleanup();
272 }
273
274 public void enablePhaseDetector(boolean enabled) {
275 phaseDetectorEnabled = enabled;
276 }
277
278 protected void reset() {
279 super.reset();
280 image = null;
281 }
282
283 protected void dialogApply() {
284 super.dialogApply();
285 image = null;
286 }
287
288 public PhaseDetector getPhaseDetector() {
289 return phaseDetector;
290 }
291
292 public Point getMousePosition() {
293 return new Point(mouseX, mouseY);
294 }
295
296 public void freeze(boolean flag) {
297 freezed = flag;
298 }
299
300 public Object clone() {
301 XYVisualization o = null;
302
303 o = (XYVisualization) super.clone();
304 o.autoPredictorname = autoPredictorname;
305 o.image = (image == null) ? null : (AutoImage)image.clone();
306
307 o.imageMap = HelperFuncs.cloneHashMap(imageMap);
308 o.itemChangeOrientation = null;
309 o.threadDataSet = HelperFuncs.cloneHashMap(threadDataSet);
310 o.sourceBrowser = (SourceBrowser)sourceBrowser.clone();
311 o.painter = (painter == null) ?null : (Painter)painter.clone();
312 o.itemBrowseSource = null;
313 o.itemChangeOrientation = null;
314 o.canvas = (AxesPanel)canvas.clone();
315 o.panel = new JScrollPane(o.canvas);
316 o.canvas.setParent((JScrollPane)o.panel);
317 o.addMagnifier(o.canvas,flipMagnifier);
318 o.addPopupTrigger(o.panel);
319 o.timeMap = new ArrayList();
320 for (int i=0; i<timeMap.size(); i++) {
321 long[] newValue = new long[2];
322 long[] oldValue = (long[])timeMap.get(i);
323 newValue[0] = oldValue[0];
324 newValue[1] = oldValue[1];
325 o.timeMap.add(newValue);
326 }
327 return o;
328 }
329
330 public ArrayList getTimeMap() {
331 return timeMap;
332 }
333
334 public int getInterval() {
335 return interval;
336 }
337
338 protected abstract String getEntityUnderMouse();
339 }